/****************************************************
 * 
 * home soft 版权所有.
 * 
 *****************************************************/

package com.homesoft.runtime.metadata.engine;

import com.homesoft.runtime.metadata.modle.IRootMetadataObject;
import com.homesoft.runtime.metadata.modle.RootObjectType;

/**
 * @author lihg
 * @data   2012-9-15
 */
public interface IMetadataEngine //extends  IModelTreeManager 
{
	/// <summary>
    /// 是否在元数据中使用事件通知机制
    /// </summary>
    boolean isNotifyEnabled();

    /// <summary>
    /// 判断一个元数据对象是否存在
    /// </summary>
    /// <param name="fullName">元数据对象的全名称</param>
    /// <returns></returns>
    boolean isHasObject(String fullName);

    /// <summary>
    /// 获取一个值表示当前引擎是否是用于设计期
    /// </summary>
    boolean isDesignMode();

    /// <summary>
    /// 获取一个强类型的元数据对象
    /// </summary>
    /// <typeparam name="T">元数据对象类型</typeparam>
    /// <param name="fullName">全名称</param>
    /// <returns>强类型的元数据对象类型，不存在返回null</returns>
    //T TryGetObject<T>(string fullName) where T : IRootMetadataObject;

    /// <summary>
    /// 获取一个强类型的元数据对象
    /// </summary>
    /// <typeparam name="T">元数据对象类型</typeparam>
    /// <param name="fullName">全名称</param>
    /// <returns>强类型的元数据对象类型，不存在就报异常</returns>
    //T GetObject<T>(string fullName) where T : IRootMetadataObject;

    /// <summary>
    /// 获取一个基类型的元数据对象
    /// </summary>
    /// <param name="fullName">元数据对象的全名称</param>
    /// <returns>元数据对象类型，不存在返回null</returns>
    IRootMetadataObject TryGetObject(String fullName);

    /// <summary>
    /// 获取一个基类型的元数据对象
    /// </summary>
    /// <param name="fullName">元数据对象的全名称</param>
    /// <returns>元数据对象类型，不存在就报异常</returns>
    IRootMetadataObject GetObject(String fullName);

    /// <summary>
    /// 获取所有元数据对象的全名称
    /// </summary>
    String[] GetFullNames();

    /// <summary>
    /// 获取某种类型的所有元数据对象的全名称
    /// </summary>
    /// <param name="objectType"></param>
    /// <returns></returns>
    String[] GetFullNames(RootObjectType objectType);

    /// <summary>
    /// 遍历访问元数据对象
    /// </summary>
    /// <param name="visitAction">遍历操作方法</param>
    //void VisitObjects(MetadataVisitAction visitAction);

    /// <summary>
    /// 遍历访问特定类型的元数据对象
    /// </summary>
    /// <param name="visitAction">遍历操作方法</param>
    /// <param name="objectType">元数据对象类型</param>
    //void VisitObjects(MetadataVisitAction visitAction, RootObjectType objectType);
}
